import { defineStore } from 'pinia'
import { login, wxLogin as apiWxLogin, getInfo as apiGetInfo } from '@/api/user'

export const useUserStore = defineStore('user', {
  state: () => ({
    token: '',
    tokenExpiration: 0,
    userInfo: {
      name: '',
      avatar: '',
    },
  }),
  actions: {
    // 设置Token的方法
    setToken(newToken: string, expiration: number) {
      this.token = newToken
      this.tokenExpiration = expiration
    },
    // 清除Token的方法
    clearToken() {
      this.token = ''
      this.tokenExpiration = 0
    },
    // 设置用户信息的方法
    setUserInfo(info: UserInfo) {
      this.userInfo = info
    },
    // 清除用户信息的方法
    clearUserInfo() {
      this.userInfo = {
        name: '',
        avatar: '',
      }
    },
    // 登录方法
    async login(username: string, password: string) {
      try {
        const response = await login(username, password)
        this.setToken(response.data.token, response.data.expiration)
        this.setUserInfo(response.data.userInfo)
        console.log('登录成功')
        return response
      } catch (error) {
        console.error('登录失败', error)
        throw error
      }
    },
    // 微信登录方法
    async wxLogin() {
      try {
        const { code } = await uni.login({
          provider: 'weixin',
        })
        if (code) {
          const response = await apiWxLogin(code)
          this.setToken(response.data.token, response.data.expiration)
          this.setUserInfo(response.data.userInfo)
          console.log('微信登录成功')
          return response
        } else {
          console.error('获取微信登录 code 失败')
          throw new Error('获取微信登录 code 失败')
        }
      } catch (error) {
        console.error('微信登录失败', error)
        throw error
      }
    },
    // 获取用户信息的方法
    async getInfo() {
      try {
        const response = await apiGetInfo()
        this.setUserInfo(response.data)
        console.log('获取用户信息成功')
        return response
      } catch (error) {
        console.error('获取用户信息失败', error)
        throw error
      }
    },
    // 检查登录状态的方法
    async checkSession() {
      if (this.token) {
        // #ifdef MP-WEIXIN
        // 如果微信登录绑定了平台账户就可以不用判断了
        uni.checkSession({
          success: () => {
            // session_key 未过期，并且在本生命周期一直有效
            console.log('微信登录态有效')
          },
          fail: () => {
            // session_key 已经失效，需要重新执行登录流程
            console.log('微信登录态已过期，需要重新登录')
            this.clearToken()
            this.clearUserInfo()
            // 调用 store 里的微信登录方法或者跳转登录页面
            // this.wxLogin();
          },
        })
        // #endif
      } else {
        // 调用 store 里的登录方法或者跳转登录页面
      }
    },
  },
  // 配置持久化
  persist: {
    // 调整为兼容多端的API
    key: 'userInfo',
    storage: {
      setItem(key, value) {
        uni.setStorageSync(key, value)
      },
      getItem(key) {
        return uni.getStorageSync(key)
      },
    },
  },
})
